perm filename RIMIO[SS,SYS] blob
sn#195723 filedate 1976-01-04 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE RIMIO
C00003 00003 ERRORS:
C00004 00004 INITIALIZATION, DISPATCH
C00007 00005 RTAPE
C00014 00006 THINGS TO WRITE LATER:
C00015 ENDMK
C⊗;
TITLE RIMIO
;CONVERTS RIM10B PAPER TAPES TO DMP FILES AND VICE-VERSA
EXTERN JOBSA,JOBREL,JOBSYM,JOBS41
A←1
B←2
C←3
D←4
CHK←13
BLK←14
LNG←15
R←16
P←17
PDLEN←←40
PDLIST: BLOCK PDLEN
OFILE: BLOCK 5 ;OFILE+4 IS THE DEVICE.
IFILE: BLOCK 5 ;IFILE+4 IS THE DEVICE
OBUF: BLOCK 3
IBUF: BLOCK 3
DMPBUF: BLOCK 200 ;RANDOM ACCESS DUMP IO BUFFER.
HILOC: 0
;ERRORS:
NOENT: OUTSTR [ASCIZ/Enter to create output file failed.
/]
JRST BEGIN
NOLALT: OUTSTR [ASCIZ/Lookup to read-alter the output file failed.
/]
JRST BEGIN
NOALT: OUTSTR [ASCIZ/Enter to read-alter the output file failed.
/]
JRST BEGIN
NOPTR: OUTSTR [ASCIZ/OPEN of device PTR: failed.
/]
JRST BEGIN
NOOPEN: OUTSTR [ASCIZ/OPEN failed
/]
JRST BEGIN
;INITIALIZATION, DISPATCH
BEGIN: RESET
MOVE P,[IOWD PDLEN,PDLIST]
RORP: OUTSTR [ASCIZ/Read tape or Punch tape? (Type R or P) /]
INCHWL A
PUSHJ P,CLRIN
TRZ A,40 ;MAKE SURE IT'S UPPERCASE
CAIN A,"R"
JRST RTAPE
CAIN A,"P"
JRST PTAPE
OUTSTR [ASCIZ/?
/]
JRST RORP
CLRIN: PUSH P,A
CLRIN1: CAIE A,175
CAIN A,12
JRST APOPJ
INCHWL A
JRST CLRIN1
;HERE'S HOW THE RIM10B LOADER LOOKS ON THE TAPE:
PTR←←104
;AC 10 CONTAINS (WHEN 5 IS EXECUTED):
; SOJA 10,4 - INITIAL POINTER OR JRST WORD
; SOJA 10,3 - MIDDLE OF DATA BLOCK
; SOJA 10,2 - WHEN READING THE CHECKSUM WORD
;
RIM10B: -16,,0 ; 0 INITIAL BLKI WORD
CONO PTR,60 ; 1 START PTR IN BINARY MODE
HRRI 10,4 ; 2 INITIALIZE 10 (FOR INDEX AND JUMP ADDR)
CONSO PTR,10 ; 3 SKIP IF DONE
JRST 3 ; 4 WAIT FOR DONE
DATAI PTR,@7(10) ; 5 STORE DATA INDIRECT (13 OR 12 OR 11)
XCT 7(10) ; 6 EXECUTES 13 OR 12 OR 11
XCT 12(10) ; 7 EXECUTES 16 OR 15 OR 14
SOJA 10,0 ;10 RH IS CLOBBERED TO 4 OR 3 OR 1
CAME 17,16 ;11 XCTED TO CHECK CHECKSUM
ADD 17,1(16) ;12 XCTED TO COMPUTE CHECKSUM
SKIPL 17,16 ;13 XCT TO INITIALIZE CHECKSUM AND
; SKIP IF THIS IS AN AOBJN WORD
JRST 4,1 ;14 XCT TO HALT IF CHECKSUM FAILS
AOBJN 16,3 ;15 XCT WHILE READING MIDDLE OF DATA BLOCK
JRST 2 ;16 XCTED BY READIN MODE. XCT TO START PRGM
;17 CHECKSUM IS STORED HERE.
RIMPTR: RIM10B-.,,RIM10B-1 ;IOWD POINTER TO THE RIM10B LOADER
;RTAPE
RTAPE: OUTSTR [ASCIZ/Output file name: /]
MOVEI R,OFILE
MOVE A,[OFILE,,OFILE+1]
SETZM OFILE
BLT A,OFILE+4
MOVSI A,'DMP'
MOVEM A,OFILE+1
PUSHJ P,GETFIL ;READ FILE NAME FROM USER.
MOVEI A,17 ;OPEN CHANNEL
SKIPN B,OFILE+4
MOVSI B,'DSK'
MOVEI C,0
OPEN 1,A
JRST NOOPEN
MOVE D,[OFILE,,A]
BLT D,D
ENTER 1,A ;SELECT OUTPUT FILE.
JRST NOENT
CLOSE 1, ;WRITE 0 LENGTH FILE.
RELEAS 1,
MOVEI A,17 ;RE-OPEN CHANNEL
SKIPN B,OFILE+4
MOVSI B,'DSK'
MOVEI C,0
OPEN 1,A
JRST NOOPEN
MOVE D,[OFILE,,A]
BLT D,D
LOOKUP 1,A ;SEEK FILE WE JUST WROTE
JRST NOLALT ;I JUST WROTE ONE. WHERE IS IT?
MOVE D,[OFILE,,A]
BLT D,D
ENTER 1,A ;ENTER READ-ALTER MODE
JRST NOALT
INIT 0,13 ;PTR IN BINARY MODE.
'PTR '
IBUF
JRST NOPTR
OUTSTR [ASCIZ/Mount paper tape and type return when ready:
/]
MOVEI A,0
PUSHJ P,CLRIN
MOVE B,RIMPTR
PUSHJ P,TREAD ;READ IOWD FOR TAPE'S LOADER
CAMLE A,1(B) ;OK IF TAPE'S LOADER IS LONGER
JRST BADRIM ;BUT NOT IF SHORTER.
MOVE C,A ;IOWD FOR TAPE'S LOADER
ADD B,[1,,1]
RIMCHK: PUSHJ P,TREAD ;
CAME A,1(B)
JRST BADRIM ;TAPE ISN'T IN RIM FORMAT.
ADD C,[1,,1]
AOBJN B,RIMCHK ;LOOP, GOBBLING THE RIM10B LOADER.
JUMPG C,RIMOK ;JUMP IF TAPE'S IOWD IS COUNTED OUT
PUSHJ P,TREAD ;READ AND THROW OUT EXTRA WORDS
AOBJN C,.-1 ;FROM THE TAPE'S LOADER.
RIMOK: PUSHJ P,FILINI
GETBLK: PUSHJ P,TREAD
SKIPL B,A ;SKIP IF THIS IS A POINTER WORD
JRST SSTART ;SET STARTING ADDRESS
MOVE CHK,B ;INITIALIZE CHECKSUM
RIMLP: PUSHJ P,TREAD
ADD CHK,A
PUSHJ P,FILSTR ;STORE IN FILE. DATA A IN LOC 1(B)
AOBJN B,RIMLP ;LOOP
PUSHJ P,TREAD ;READ CHECKSUM WORD
CAMN A,CHK
JRST GETBLK ;GET ANOTHER IOWD.
OUTSTR [ASCIZ/Checksum failure.
/]
HALT GETBLK
UNEOF: OUTSTR [ASCIZ/Unexpected End of File from PTR:
/]
MOVEI A,0 ;STORE ZERO FOR THE STARTING ADDRE.
SSTART: MOVE B,HILOC ;GET HIGHEST LOC LOADED.
HRLI A,1(B) ;ONE BEYOND IS INITIAL JOBFF
MOVEI B,JOBSA-1
PUSHJ P,FILSTR
PUSHJ P,FILFRC
CLOSE 1,
RELEAS 1,
RELEAS 0,
JRST BEGIN
BADRIM: OUTSTR [ASCIZ/Bad format RIM10B loader at the front of the tape?
/]
JRST BEGIN
PTRERR: OUTSTR [ASCIZ/PTR input error
/]
GETSTS 0,A
HALT .+1
SETSTS 0,10
TREAD: SOSLE IBUF+2
JRST TRED1
INPUT 0,
STATZ 0,20000
JRST [POP P,(P)
JRST UNEOF]
STATZ 0,740000
JRST PTRERR
TRED1: ILDB A,IBUF+1
POPJ P,
FILSTR: MOVEI C,1(B) ;C←ABSOLUTE ADDRESS.
CAIN C,36 ;EXEC MODE JOBSYM?
MOVEI C,JOBSYM
CAIN C,41 ;UUO TRAP?
MOVEI C,JOBS41 ;YES. HERE'S WHERE IT BELONGS IN DMP FORMAT
CAMLE C,HILOC ;IS THIS HIGHEST LOC LOADED THUS FAR?
MOVEM C,HILOC ;YES. SAVE HIGHEST LOC LOADED.
SUBI C,74 ;OFFSET TO DMP FILE ORIGIN=WORD # IN FILE.
JUMPL C,CPOPJ ;RETURN IF OFF THE FRONT.
IDIVI C,200 ;BLOCK NUMBER-1 IN C, WORD NUMBER IN D.
ADDI C,1 ;THIS IS THE USET POINTER
CAIN C,(BLK) ;SAME AS WHAT'S IN CORE?
JRST FILST2 ;YES. - THIS IS THE EASY CASE.
FILST0: PUSHJ P,FILFRC ;FORCE CURRENT RECORD OUT. ADVANCE TO NEXT
CAIG C,(LNG) ;IS DESIRED RECORD WITHIN EXISTING FILE?
JRST FILST1 ;YES. READ IT (UNLESS THE LAST RECORD)
MOVEI BLK,(LNG) ;SET TO APPEND A ZERO RECORD TO THE FILE.
JRST FILST0
FILST1: MOVEI BLK,(C) ;MAKE DESIRED RECORD THE CURRENT RECORD
CAIL BLK,(LNG) ;IS THIS THE NON-EX RECORD AT END OF FILE?
JRST FILST2 ;YES. WE CAN'T (AND DON'T NEED TO) READ IT.
USETI 1,(BLK)
INPUT 1,[-200,,DMPBUF-1
0]
FILST2: MOVEM A,DMPBUF(D) ;STORE DATA
POPJ P,
FILINI: MOVEI BLK,1 ;REC # THAT IS "IN CORE".
MOVEI LNG,1 ;RECORD NUMBER OF EOF
SETZM HILOC ;HIGHEST LOCATION LOADED
FILCLR: SETZM DMPBUF
PUSH P,A
MOVE A,[DMPBUF,,DMPBUF+1]
BLT A,DMPBUF+177
APOPJ: POP P,A
CPOPJ: POPJ P,
FILFRC: USETO 1,(BLK) ;SELECT OUTPUT RECORD ALWAYS
OUTPUT 1,[-200,,DMPBUF-1 ;WRITE CURRENT RECORD.
0]
ADDI BLK,1
CAMGE LNG,BLK
MOVE LNG,BLK ;INCREASE LNG IF INCREASING FILE.
JRST FILCLR ;NEXT RECORD NUMBER
;THINGS TO WRITE LATER:
GETFIL: MOVE A,['RIMOUT']
MOVEM A,(R)
OUTSTR [ASCIZ/RIMOUT.DMP
/]
POPJ P,
PTAPE: OUTSTR [ASCIZ/Not ready.
/]
jrst begin
END BEGIN